/*

给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。

有效字符串需满足：

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :6.4 MB, 在所有 C++ 提交中击败了100.00%的用户

复杂度分析：
只有遍历的一次，时间O(n),空间O(n)

*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <string.h>
#include <stack>
using namespace std;

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for (unsigned int i = 0;i < s.size();i++) {
            if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
                st.push(s[i]);
            }
            int a = (int)s[i];
            switch(a) {
                case (int)')':
                	if (st.empty()) {
                		return 0;
                	}
                    if (st.top() == '(') {
                        st.pop();
                    }
                    else {
                        st.push(s[i]);
                    }
                    break;
                case (int)']':
                	if (st.empty()) {
                		return 0;
                	}
                    if (st.top() == '[') {
                        st.pop();
                    }
                    else {
                        st.push(s[i]);
                    }
                    break;
                case (int)'}':
                	if (st.empty()) {
                		return 0;
                	}
                    if (st.top() == '{') {
                        st.pop();
                    }
                    else {
                        st.push(s[i]);
                    }
                    break;
            }
        }
        return st.empty();
    }
};
int main(int argc, char const* argv[]) {
    Solution s;
    string a = "([)";	
    cout<<s.isValid(a)<<endl;	
    return 0;
}
